package org.ciallo.easytokencore.exception;

import org.ciallo.easytokencore.error.EasyErrorCode;
import org.ciallo.easytokencore.util.VerificationUtils;

/**
 * Easy-Token 核心异常类
 *
 * <p>核心功能：</p>
 * <ul>
 *   <li>封装Token相关的业务异常</li>
 *   <li>支持错误码机制，与EasyErrorCode配合使用</li>
 *   <li>提供便捷的断言方法(notTrue/notEmpty)</li>
 *   <li>支持链式调用设置错误码</li>
 * </ul>
 *
 * <p>使用说明：</p>
 * <ol>
 *   <li>所有Token相关异常都应使用此类抛出</li>
 *   <li>建议使用预定义的错误码(EasyErrorCode)</li>
 *   <li>断言方法可简化参数校验代码</li>
 * </ol>
 *
 * <p>使用示例：</p>
 * <pre>
 * {@code
 * // 抛出带错误码的异常
 * throw new EasyTokenException("Token无效")
 *     .setCode(EasyErrorCode.CODE_INVALID_TOKEN);
 *
 * // 使用断言方法
 * EasyTokenException.notEmpty(token, "Token不能为空");
 * }
 * </pre>
 *
 * @Description: Easy-Token 核心异常类
 * @Author: Jukomu
 * @Package: org.ciallo.easytokencore.exception
 * @Project: easy-token-demo
 * @Version: 1.0.0
 * @name: EasyTokenException
 * @Date: 2025-05-06
 * @Filename: EasyTokenException
 * @see EasyErrorCode
 */
public class EasyTokenException extends RuntimeException {
    /**
     * 序列化版本号
     */
    private static final long serialVersionUID = 6806129545290130132L;

    /**
     * 异常细分状态码
     */
    private int code = EasyErrorCode.CODE_UNDEFINED;

    /**
     * 构建一个异常
     *
     * @param code 异常细分状态码
     */
    public EasyTokenException(int code) {
        super();
        this.code = code;
    }


    /**
     * 构建一个异常
     *
     * @param message 异常描述信息
     */
    public EasyTokenException(String message) {
        super(message);
    }

    /**
     * 构建一个异常
     *
     * @param code    异常细分状态码
     * @param message 异常信息
     */
    public EasyTokenException(int code, String message) {
        super(message);
        this.code = code;
    }

    /**
     * 构建一个异常
     *
     * @param cause 异常对象
     */
    public EasyTokenException(Throwable cause) {
        super(cause);
    }

    /**
     * 构建一个异常
     *
     * @param message 异常信息
     * @param cause   异常对象
     */
    public EasyTokenException(String message, Throwable cause) {
        super(message, cause);
    }

    /**
     * 获取异常细分状态码
     *
     * @return 异常细分状态码
     */
    public int getCode() {
        return code;
    }

    /**
     * 写入异常细分状态码
     *
     * @param code 异常细分状态码
     * @return 对象自身
     */
    public EasyTokenException setCode(int code) {
        this.code = code;
        return this;
    }

    /**
     * 断言 flag 不为 true，否则抛出 message 异常
     *
     * @param flag    标记
     * @param message 异常信息
     */
    public static void notTrue(boolean flag, String message) {
        notTrue(flag, message, EasyErrorCode.CODE_UNDEFINED);
    }

    /**
     * 断言 flag 不为 true，否则抛出 message 异常
     *
     * @param flag    标记
     * @param message 异常信息
     * @param code    异常细分状态码
     */
    public static void notTrue(boolean flag, String message, int code) {
        if (flag) {
            throw new EasyTokenException(message).setCode(code);
        }
    }

    /**
     * 断言 value 不为空，否则抛出 message 异常
     *
     * @param value   值
     * @param message 异常信息
     */
    public static void notEmpty(Object value, String message) {
        notEmpty(value, message, EasyErrorCode.CODE_UNDEFINED);
    }

    /**
     * 断言 value 不为空，否则抛出 message 异常
     *
     * @param value   值
     * @param message 异常信息
     * @param code    异常细分状态码
     */
    public static void notEmpty(Object value, String message, int code) {
        if (VerificationUtils.isNull(value)) {
            throw new EasyTokenException(message).setCode(code);
        }
    }

    // ------------------- 已过期 -------------------

    /**
     * 如果flag==true，则抛出message异常
     * <h2>已过期：请使用 notTrue 代替，用法不变</h2>
     *
     * @param flag    标记
     * @param message 异常信息
     * @param code    异常细分状态码
     */
    @Deprecated
    public static void throwBy(boolean flag, String message, int code) {
        if (flag) {
            throw new EasyTokenException(message).setCode(code);
        }
    }

    /**
     * 如果value==null或者isEmpty，则抛出message异常
     * <h2>已过期：请使用 notEmpty 代替，用法不变</h2>
     *
     * @param value   值
     * @param message 异常信息
     * @param code    异常细分状态码
     */
    @Deprecated
    public static void throwByNull(Object value, String message, int code) {
        if (VerificationUtils.isNull(value)) {
            throw new EasyTokenException(message).setCode(code);
        }
    }

}
